iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0

本篇將會講如何控制手電筒。

由於手電筒的燈是用相機的閃光燈,所以我們需要使用到相機的參數
第一步:添加權限

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

第二步:創建 button 來開關手電筒

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="264dp"
        android:text="開手電筒"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="關手電筒"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/open" />
</androidx.constraintlayout.widget.ConstraintLayout>

第三步:呼叫相機、創建的button並設定功能

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        open =findViewById(R.id.open);
        close = findViewById(R.id.close);
        manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        open.setOnClickListener(this);
        close.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch(view.getId()) {
            case R.id.open:
                lightopen();
                break;
            case R.id.close:
                lightclose();
                break;
        }
    }
    private void lightopen(){
        lightSwitch(false);
    }
    private void lightclose(){
        lightSwitch(true);
    }

寫入在復程式裡的lightSwitch的方法

private void lightSwitch(final boolean lightStatus) {
        if (lightStatus) { // 關手電筒
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //當版本大於等於23時會執行
                try {
                    manager.setTorchMode("0", false);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
            //如果版本沒有大於23就會釋放相機
                if (m_Camera != null) {
                    m_Camera.stopPreview();
                    m_Camera.release();
                    m_Camera = null;
                }
            }
        } else { // 開手電筒
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //當版本大於等於23時會執行
                try {
                    manager.setTorchMode("0", true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                final PackageManager pm = getPackageManager();
                final FeatureInfo[] features = pm.getSystemAvailableFeatures();
                for (final FeatureInfo f : features) {
                    if (PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)) { 
                    //看是否支援閃光燈
                        if (null == m_Camera) {
                            m_Camera = Camera.open();
                        }
                        final Camera.Parameters parameters = m_Camera.getParameters();
                        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                        m_Camera.setParameters(parameters);
                        m_Camera.startPreview();
                    }
                }
            }
        }
    }

這樣手電筒就可以開了。
注意!!!!
這個方式的相機在 import 時會發現已經被畫掉了,這表示已經被android studio 棄用了但還是可以使用。


上一篇
#第14篇:RxJava 合併 Retrofit2
下一篇
第16篇:如何使手機震動
系列文
Android的30天學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言